Добрый день Артем!
Спасибо за ответ на предыдущий вопрос!
Напишите пожалуйста как пользоватся OnKeyDown (если ето та функция
что я имею ввиду), их там немало OnKeyUp , OnKeyDownEvent ,
OnKeyPress , ...
Например при нажатии на J ...
И при нажатии на такие кнопки как ВВЕРХ , ВНИЗ,TAB, F1 .......
Thanx !!!
ostrongi@takas.lt
Ну что, давайте поговорим о том, как вообще сообщения Windows в том
числе и нажатие клавиш появляются, и как они обрабатываются MFC. Давайте
создадим приложение MFC AppWizard как окно MDI, то есть с многими
окнами и назовем его TestKeys.
Как известно, самый главный класс у нас CTestKeysApp, он порожден от CWinApp и поэтому сообщения от Windows поступают сначала туда. Давайте перегрузим функцию первоначальной обработки сообщения PreTranslateMessage

BOOL CTestKeysApp::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
MessageBeep(-1);
return CWinApp::PreTranslateMessage(pMsg);
}
Запустите это приложение и Вы увидите, что на любое Ваше действие комп
будет пищать !!! В том числе и на нажатие клавиш !!!. То есть обработать при
желании можно и здесь. Куда дальше будет передаваться сообщение ?? В
CMainFrame. Здесь тоже сообщение можно отловить еще до обработки. Вот
так. BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
MessageBeep(-1);
return CMDIFrameWnd::PreTranslateMessage(pMsg);
}
Запустите и увидите то же самое. На каждое действие будет писк. Дальше
сообщение предлается Виду CTestKeysView. Здесь мы той же функцией можем
его отследить. BOOL CTestKeysView::PreTranslateMessage(MSG* pMsg)
{
MessageBeep(-1);
return CView::PreTranslateMessage(pMsg);
}
Всё то же самое, писк на все сообщения. Ну давайте произведем отсев
сообщений и будем ловить только те, которые приходят от нажатых клавиш. Мы можем
отпеределить нажатие клавиши KEYDOWN и её отпускание KEYUP.
Давайте обработаем нажатие. void CTestKeysView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
MessageBeep(-1);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
Как же определить какая клавиша нажата ? Для этого есть параметр
bChar, который можно сравнить в виртуальной клавишей, например, так: if (nChar==VK_F1) MessageBeep(-1);Список их можно найти в winuser.h. Так же можно перегрузить сообщение WM_CHAR извещающее о нажатии клавиши. Управление данной функции будет передано только если нажат конкретный символ. Например, на нажатие на клавишу F1 она не реагирует.
void CTestKeysView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
MessageBeep(-1);
CView::OnChar(nChar, nRepCnt, nFlags);
}
Несколько отличается обработка нажатия клавиш в классе COleControl. Здесь появляется функция OnKeyPressEvent и функция FireKeyDown и так далее. Но об этом нужно разговаривать отдельно.